﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using log4net;
using log4net.Core;
using log4net.Config;
using System.IO;

namespace Com.LongER.Framework.Utils.LogUtils
{
    public class Log
    {
        //ロギングオブジェクト(log4net)
        private ILog _Logger = null;

        private static Log _Log = new Log();

        public Log()
        {
            SetLogger();
        }

        public static Log GetInstance()
        {
            return _Log;

        }

        /** <summary>
          * Infoレベルのログを出力する。
          * </summary>
          * <param name="LogMessage">ログ内容</param>
          * <remarks>
          * </remarks>
          * <history>
          * 	
          * </history>
         */
        public void Info(String LogMessage)
        {
            try
            {
                StringBuilder Comment = new StringBuilder();

                SetLogger();

                Comment.Append(GetLocation());
                Comment.Append(" - ");
                Comment.Append(LogMessage);

                if (_Logger.IsInfoEnabled)
                    _Logger.Info(Comment.ToString());

            }
            catch (Exception ex)
            {

            }

        }

        /** <summary>
          * Errorレベルのログを出力する。
          * </summary>
          * <param name="LogMessage">ログ内容</param>
          * <remarks>
          * </remarks>
          * <history>
          * 	
          * </history>
         */
        public void Error(String LogMessage)
        {
            try
            {
                StringBuilder Comment = new StringBuilder();

                SetLogger();

                Comment.Append(GetLocation());
                Comment.Append(" - ");
                Comment.Append(LogMessage);

                if (_Logger.IsErrorEnabled)
                    _Logger.Error(Comment.ToString());

            }
            catch (Exception ex)
            {

            }

        }

        /** <summary>
          * デバッグレベルのログを出力する。
          * </summary>
          * <param name="LogMessage">ログ内容</param>
          * <remarks>
          * </remarks>
          * <history>
          * 	
          * </history>
        */
        public void Debug(String LogMessage)
        {
            try
            {
                StringBuilder Comment = new StringBuilder();

                SetLogger();

                Comment.Append(GetLocation());
                Comment.Append(" - ");
                Comment.Append(LogMessage);

                if (_Logger.IsDebugEnabled)
                    _Logger.Debug(Comment.ToString());

            }
            catch (Exception ex)
            {

            }

        }

        /** <summary>
          * Loggerを設定する。
          * </summary>
          * <remarks>
          * </remarks>
          * <history>
          * 	
          * </history>
          * 
        */
        private void SetLogger()
        {

            StringBuilder Ret = new StringBuilder();
            string wkStr = String.Empty;
            int i = 0;

            try
            {
                StackTrace Trace = new StackTrace(true);

                String[] NameArray = Trace.GetFrame(2).GetMethod().DeclaringType.Namespace.Split(Convert.ToChar("."));
                for (i = 0; i <= NameArray.Length - 1; i++)
                {
                    if ((i.Equals(0)))
                    {
                        wkStr = NameArray[i];
                    }
                    else
                    {
                        wkStr = wkStr + "." + NameArray[i];
                    }
                }
                _Logger = log4net.LogManager.GetLogger(wkStr);

            }
            catch (Exception ex)
            {

            }

        }

        /** <summary>
          * ログ発生元クラスよりロケーション情報を取得する。
          * </summary>
          * <returns>ログ発生位置</returns>
          * <remarks>
          * </remarks>
          * <history>
          * 	
          * </history>
        */
        private string GetLocation()
        {

            StringBuilder Ret = new StringBuilder();

            try
            {
                StackTrace Trace = new StackTrace(true);
                
                Ret.Append(Trace.GetFrame(2).GetMethod().DeclaringType.Namespace);
                Ret.Append(".");
                Ret.Append(Trace.GetFrame(2).GetMethod().ReflectedType.Name);
                Ret.Append("#");
                Ret.Append(Trace.GetFrame(2).GetMethod());
                Ret.Append("(");
                Ret.Append(Trace.GetFrame(2).GetFileLineNumber());
                Ret.Append(")");

            }
            catch (Exception ex)
            {

            }

            return Ret.ToString();

        }
    }
}
